package main

import "fmt"

// 设定一个数组常量该常量为5
const DynamicArrayCap = 5

// 动态数组结构体
type DynamicArray struct {
	items  []interface{}
	cap    int
	length int
}

// 数组对象构造方法 --> 初始化一个初始长度为5的动态数组
func NewDynamicArray() *DynamicArray {
	return &DynamicArray{
		items:  make([]interface{}, DynamicArrayCap),
		cap:    DynamicArrayCap,
		length: 0,
	}
}

// 获取数组大小GetSize
func (arr *DynamicArray) GetSize() int {
	return arr.cap
}

// 获取数组元素个数Length
func (arr *DynamicArray) GetLength() int {
	return arr.length
}

// Push方法,添加元素到末尾
func (arr *DynamicArray) Push(e interface{}) {
	arr.length++
	arr.expandCap()
	arr.items[arr.GetLength()-1] = e
}

// Pop方法,删除队尾元素
func (arr *DynamicArray) pop() interface{} {
	if arr.GetLength() <= 0 {
		fmt.Println("error array is nil")
		return nil
	}
	e := arr.items[arr.GetLength()-1]
	arr.items[arr.GetLength()-1] = nil
	arr.length--

	arr.reduceCap()
	return e
}

// 扩容方法：超过数组容量，按照当前容量的 2 倍扩容
func (arr *DynamicArray) expandCap() {
	if arr.length <= arr.cap {
		return
	}
	newSize := arr.GetSize() * 2
	newItems := make([]interface{}, newSize)
	for i := 0; i < arr.GetLength()-1; i++ {
		newItems[i] = arr.items[i]
	}
	arr.items = newItems
	arr.cap = newSize
}

// 缩容方法：数组元素个数为当前容量 1/4 时，缩容为当前容量的一半
func (arr *DynamicArray) reduceCap() {
	if arr.length > arr.cap/4 {
		return
	}
	newSize := arr.GetSize() / 2
	newItems := make([]interface{}, newSize)
	for i := 0; i < arr.GetLength()-1; i++ {
		arr.items = newItems
		arr.cap = newSize
	}
}

// get方法
func (arr *DynamicArray) GetItem(index int) interface{} {
	if index < 0 || index > arr.GetLength()-1 {
		fmt.Println("err,array out of range")
		return nil
	}
	return arr.items[index]
}

func main() {
	myArray := NewDynamicArray()
	fmt.Println(myArray)
	myArray.Push("h")
	myArray.Push("e")
	myArray.Push("l")
	myArray.Push("l")
	myArray.Push("o")
	fmt.Println(myArray)
	myArray.Push("w")
	fmt.Println(myArray)

}
